package jass.generators;
import jass.engine.*;

/**
   A force model based on looping through a buffer once, loaded from an audio
   file or provided by caller.
   @author Kees van den Doel (kvdoel@cs.ubc.ca)
*/
public class OneShotBuffer extends LoopBuffer {

    /** True if is outputting buffer. */
    private boolean isHit = false;

    /** Construct loop force from named file.
        @param srate sampling rate in Hertz.
        @param bufferSize bufferSize of this Out.
        @param fn Audio file name.
    */
    public OneShotBuffer(float srate, int bufferSize, String fn) {
        super(srate,bufferSize,fn);
        reset();
    }

    /** Construct loop force and provide buffer.
        @param srate sampling rate in Hertz.
        @param bufferSize bufferSize of this Out.
        @param loopBuffer looping buffer.
    */
    public OneShotBuffer(float srate, int bufferSize, float[] loopBuffer) {
        super(srate,bufferSize,loopBuffer);
        reset();
    }

    /** Calling this method will cause next call to getBuffer() to
        start playback of the buffer.
    */
    public void hit() {
        isHit = true;
    }

    /** Reset buffer.
     */
    private void reset() {
        isHit = false; 
        ix = 0;
        x = 0;
    }
    
    /** Compute the next buffer. If not hit return zero.
     */
    public void computeBuffer() {
        int bufsz = getBufferSize();
        if(!isHit) {
            for(int k=0;k<bufsz;k++) {
                buf[k] = 0;
            }
        } else {
            // fill with buffer until end is reached
            for(int k=0;k<bufsz;k++) {
                int ixnext = ix + dix;
                if(x + dx >= 1) {
                    ixnext++;
                }
                float y = getNextSample();
                if(ixnext >= loopBufferLength) { // wrapped around: stop
                    buf[k] = y;
                    reset(); // done
                    break;
                } else {
                    buf[k] = y;
                }
            }
        }
    }

}


